package base.generic.demo08;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

import org.junit.Test;


public class TestCase {

    /**
     * 利用java反射可以绕过泛型的限制
     */
    @Test
    public void testCase1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);

        Object invoke = list.getClass()
                .getMethod("add", Object.class)
                .invoke(list, "abc");
        System.out.println(invoke);// true，返回 list.add(x) 执行结果
        System.out.println(list);//[1, abc]
    }

    /**
     * 演示泛型方法不能让编译器进行类型约束,但是泛型类可以
     */
    @Test
    public void testCase2(){
        //泛型方法不能约束类型
        GeneratorDao dao = new GeneratorDao();
        dao.add("abc");
        int i = dao.findById(1);

        //泛型类可以约束类型
        GeneratorDao2<String> dao2 = new GeneratorDao2<>();
        dao2.add("abc");
//        int s = dao2.findById(1); //返回值必须是String
    }
}


/**
 * 	演示泛型方法不能让编译器进行类型约束
 */
class GeneratorDao {
    // 泛型方法定义，无返回值，添加任意类型
    public <T> void add(T t){ }

    // 泛型方法定义，返回任意类型
    public <T> T findById(int id){
        return null;
    }
}


class GeneratorDao2<T> {
    public void add(T t){}

    public T findById(int id){
        return null;
    }
}

